範型(paradigm),即為典型範例 - 標準結構化程式設計比較異同的方式,可以想像成一種程式設計風格。常見的範型還有:函數式程式設計、指令式程式設計、程序式程式設計等等。
相信有在寫程式的pg或碼農們(我就是其中一個= =),最討厭的就是需求一直在變動,寫好的程式碼要一直修修改改,書中有提及:
許多bug都源於程式碼的修改
沒錯!當你想說程式碼改個小地方而已,卻沒想到其他地方也跟著報錯,接著就會越錯越多,一步錯步步錯,然後過了一小時後看到滿滿紅色蚯蚓的程式碼,(決定關掉專案先躺平再說…),這種情況蠻常發生的,但我們又沒辦法有強而有力的說詞去說服主管或客戶,因為程式碼改了會報錯,所以這次的需求沒辦法達成唷(會被打XD),所以我們必須要學會如何彈性的寫程式。
這裡先提及一個常見的術語,內聚性(cohesion) & 耦合性(coupling):
內聚性指的是「一個副程式內部組成部分之間相互關聯的緊密程度」。
耦合性指的是「兩個副程式之間關聯的緊密程度」。
上面有說到程式碼修改後會像雪球滾下山,越滾越大的原因,就是因為低內聚與高耦合造成的!
我們雖然無法預測到未來的需求會發生甚麼變化,但通常是可以預期到哪裡會發生改變。物件導向的最大優點之一,就是可以封裝這些變化區域,因此可以更容易將程式與變化產生的影響隔離開來。
假設你現在是講師,聽課的學生在課後要到其他教室去上別的課程,但他們並不知道下一堂聽課的地點,此時你的責任就是確保所有學生都能知道下一堂課要去哪裡上。
如果照結構化程式設計方式,可能會分成以下步驟:
但如果換個思考方式,講師將從這間教室到所有的其他上課地點的路線都列出來,並且貼到教室佈告欄上,只要在下課時告訴學生們請自行到佈告欄查看你們如何到下堂課地點的路線,這樣就好了。
兩者之間最大的差距就是『責任的轉移』,如果以程式角度來看:
(是不是有一種似曾相似的感覺,好像在C#中使用介面 Interface 去定義每個 Class 需要實作的方法)
最後提一下本書中介紹到 Martin Fowler 的三個不同視角
視角 | 描述 |
---|---|
概念 | 這種視角「呈現了所研究的領域中的各種概念,得出概念模型時應該很少或者不考慮實作它的軟體」。這個視角要回答的問題是: 「軟體要負責什麼?」 |
規約 | 「現在我們要考慮的是軟體,但我們關注的是軟體的介面,而不是實 作。」這個視角要回答的問題是:「怎麼使用軟體?」 |
實作 | 這時我們考慮的是程式碼本身。「這可能是最常用的視角,但在許多方面,採取規約視角經常會更好。」這個視角要回答的問題是:「軟體怎樣履行自己的責任?」 |
今天先寫到這裡,看完這個例子,是不是越來越有感覺,好像常常碰到呀,我們明天再繼續說下去~~
想問這個挑戰是不是較不適合程式初學者?
目前大概程度是剛學完資料結構演算法與物件導向程式設計
不會不適合,本書作者也有提到,在學習物件導向技術的過程中早一點認識設計模式,可以加深對分析以及設計的理解!
好的 謝謝!會撥空來學習的